﻿unit F_Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, acAlphaHints, JvFormPlacement, JvComponentBase,
  JvAppStorage, JvAppIniStorage, IdComponent, IdTCPConnection,
  IdTCPClient, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, ExtCtrls,
  IdContext, IdScheduler, IdSchedulerOfThread, IdSchedulerOfThreadDefault,
  IdCustomTCPServer, IdTCPServer, XPMan, ComCtrls, JvZlibMultiple, Mask,
  JvExMask, JvSpin, AppEvnts,TlHelp32, Shellapi, TeEngine, Series, TeeProcs,
  Chart, ImgList, JvThreadTimer, IdExplicitTLSClientServerBase, IdFTP, Buttons,
  sBevel;

type
  TFormMain = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit_Host: TEdit;
    Edit_IP: TEdit;
    Label3: TLabel;
    Button_Start: TButton;
    Button_Cancel: TButton;
    AppIniFileStorage: TJvAppIniFileStorage;
    FormStorage: TJvFormStorage;
    AlphaHints: TsAlphaHints;
    Check_Test: TCheckBox;
    Edit_OS: TEdit;
    Label4: TLabel;
    Edit_RG: TEdit;
    Label6: TLabel;
    Label5: TLabel;
    Edit_MAC: TEdit;
    Check_All: TCheckBox;
    AntiFreeze: TIdAntiFreeze;
    Client: TIdTCPClient;
    Timer: TTimer;
    Panel1: TPanel;
    Edit_Server: TEdit;
    Label10: TLabel;
    SchedulerOfThreadDefault: TIdSchedulerOfThreadDefault;
    Server: TIdTCPServer;
    XPManifest: TXPManifest;
    StatusBar: TStatusBar;
    BoxAdmin: TGroupBox;
    Button2: TButton;
    Zip: TJvZlibMultiple;
    Label11: TLabel;
    Edit_timeout: TJvSpinEdit;
    TrayIcon: TTrayIcon;
    ApplicationEvents: TApplicationEvents;
    Check_Tray: TCheckBox;
    ImageSSS1: TImage;
    ImageList_Tree: TImageList;
    Check_AutoStart: TCheckBox;
    ImageSSS2: TImage;
    ImageSSS3: TImage;
    ImageSSS4: TImage;
    ImageSSS5: TImage;
    Check_Fast: TCheckBox;
    Check_NonDel: TCheckBox;
    FTP: TIdFTP;
    Panel2: TPanel;
    Label9: TLabel;
    MemoServer: TMemo;
    Panel3: TPanel;
    Label8: TLabel;
    MemoLog: TMemo;
    GroupBox2: TGroupBox;
    ListBox: TListBox;
    Button_Send: TBitBtn;
    Bevel1: TBevel;
    Bevel2: TBevel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ListBox2Click(Sender: TObject);
    procedure Button_StartClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button_CancelClick(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure ClientConnected(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure ServerExecute(AContext: TIdContext);
    procedure ServerConnect(AContext: TIdContext);
    procedure ServerDisconnect(AContext: TIdContext);
    procedure MemoServerDblClick(Sender: TObject);
    procedure ClientDisconnected(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure TrayIconClick(Sender: TObject);
    procedure ApplicationEventsMinimize(Sender: TObject);
    procedure Check_AutoStartClick(Sender: TObject);
    procedure MemoLogDblClick(Sender: TObject);
    procedure ListBox2DblClick(Sender: TObject);
    procedure ListBox2DrawItem(Control: TWinControl; Index: Integer; Rect: TRect;
      State: TOwnerDrawState);
    procedure Button_SendClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    procedure PauseAndMouse;
    // Перехват завершения сесии на ПК
    procedure WMQueryEndSession (var Msg : TWMQueryEndSession); message WM_QueryEndSession;
    // Считывани сценария
    procedure ReadSC;
    // Сценарии
    function ENT(WCaption, WClas, EXE:string):boolean;
    function SS(WCaption, WClas, EXE:string):boolean;
    function SSS(WCaption, WClas, EXE:string):boolean;
    function XS(WCaption, WClas, EXE:string):boolean;
    function LG(WCaption, WClas, EXE:string):boolean;
    function Ret(WCaption, WClas, EXE:string):boolean;
    // Поиск картинки tr со скриншота, начиная м координат x,y
    Function FindPict(x,y:integer;tr:timage):Boolean;
    // Отправка отчётов по FTP
    function SendReports:boolean;
    // Установка расширеных элементов управления
    Procedure SetAdmin;
  public
  end;

var
  FormMain: TFormMain;
  Host,IP, MAC, RG:string;   // Хост, IP, mac адрес и рабочая группа
  PathToTempSend,Path,PathRep,PathToSend,PathPr:string;       // Путь к программе и к каталогу с отчетами
  MainWindow,gw:HWND;
  P: TSmallPoint;
  HookHandle: DWORD = 0;
  fb:boolean=true;
  WParam : LongInt;
  WRect,WClientRect:TRect;
  ListP:TStringList;        // Сценарий
  Cancel:boolean=False;     // Признак отмены
  Run:Boolean=False;        // Признак соединение с сервером
  CRC:boolean=false;        // Совпадает ди CRC
  sc:boolean=false;
  Ssc:TStringList;
  ico: TIcon;
  isRun,isClose,notcon:Boolean;
  Admin:Boolean;



implementation

uses  U_Autorun, U_CRC, IdSocketHandle, WinSock,CommCtrl, Registry, u_API, Clipbrd,U_WinVersion, u_net,IdStackBSDBase,
  F_Wait,StrUtils,u_SID,ShlObj;

{$R *.dfm}

procedure ShutdownComputer;
var
  ph: THandle;
  tp, prevst: TTokenPrivileges;
  rl: DWORD;
begin
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY, ph);
  LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid);
  tp.PrivilegeCount := 1;
  tp.Privileges[0].Attributes := 2;
  AdjustTokenPrivileges(ph, FALSE, tp, SizeOf(prevst), prevst, rl);
  ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;


Procedure TFormMain.SetAdmin;
Begin
  BoxAdmin.Visible:=Admin;
  Edit_Server.Enabled:=Admin;
  Check_Tray.Enabled:=Admin;
  Check_AutoStart.Enabled:=Admin;
  Button_Start.Visible:=Admin;
  Button_Cancel.Visible:=Admin;
  Button_Send.Visible:=Admin;
  ListBox.Enabled:=Admin;
End;

procedure FileCopy(const SourceFileName, TargetFileName: ansistring);
var
  S, T : TFileStream;
begin
  S := TFileStream.Create(sourcefilename, fmOpenRead );
  try
    T := TFileStream.Create(targetfilename, fmOpenWrite or fmCreate);
    try
      T.CopyFrom(S, S.Size ) ;
      FileSetDate(T.Handle, FileGetDate(S.Handle));
    finally
      T.Free;
    end;
  finally
    S.Free;
  end;
end;

procedure TFormMain.WMQueryEndSession (var Msg : TWMQueryEndSession);
begin
  Close;
end;


procedure TFormMain.PauseAndMouse;
var x,y,i:integer;
    b:integer;
begin
  Pause(30*1000{}{2*1000*60{});
  if Cancel then Exit;
  for I := 0 to 10 do begin
    b:=random(2);
    if b=0 then x:=2
           else x:=-2;
    b:=random(2);
    if b=0 then y:=2
           else y:=-2;
    Mouse_Event(MOUSEEVENTF_MOVE, x, y, 0, 0);
    application.ProcessMessages;
    pause(100);
  end;
  Pause(1000);
end;

function TFormMain.XS(WCaption, WClas, EXE:string):boolean;
var wnd: HWND;
    endOk,i,wl,wt:integer;
    d:string;
    endS:Boolean;
label en;
begin
  Result:=true;

  // Копируем файл профиля
  if not Check_Fast.Checked then begin
    MemoLog.Lines.Add('Копируем профиль');
    sysutils.DeleteFile(PathPr+'XSpider\Profiles\Default.prf');
    Pause(500);
    FileCopy(Path+'Default.prf',PathPr+'XSpider\Profiles\Default.prf');
    MemoLog.Lines.Add('Окончание копирования');
    Pause(1000);
  end;

  // Запуск программы
  if not RunProgram(WCaption, WClas,
                    path, EXE,  MainWindow, WRect, WClientRect ) then Exit(false);
  // Закрытие окна о подписке
  Pause(500);
  if FindWindowWait('XSpider', '#32770', 5, 0,  wnd) then begin
    ActiveWin(wnd);
    SendMessage (wnd,WM_CLOSE,0,0);
    Pause(500);
  end;
  ActiveWin(MainWindow);
  SetLayoutActiveWnd(MainWindow);

  // Добавляем хост
  MemoLog.Lines.Add('Добавляем хост');
  keybd_event(VK_INSERT,0,0,0);
  keybd_event(VK_INSERT,0,keyeventf_keyup,0 );
  Pause(3000);
  // Поиск окна
  FindWindowWait('', 'Tfm_add_host',5,0,wnd);
  if wnd=0 then Exit(false);

  SetLayoutActiveWnd(wnd);
  // ВВод IP
  SendKeys(IP);
  Pause(100);
  // Подтверждение ввода
  keybd_event(VK_RETURN,0,0,0);
  keybd_event(VK_RETURN,0,keyeventf_keyup,0 );
  Pause(100);
  // Стартуем
  keybd_event(VK_CONTROL, 0, 0, 0);
  keybd_event(Ord('R'), 0, 0, 0);
  keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  Pause(100);
  // Убираем предупреждение, если много портов
  if not Check_Fast.Checked then
  if FindWindowWait('', 'Tfm_dos', 5, 5,  wnd) then begin
    ActiveWin(wnd);
    Pause(100);
    keybd_event(VK_TAB,0,0,0);
    keybd_event(VK_TAB,0,keyeventf_keyup,0 );
    Pause(100);
    keybd_event(VK_TAB,0,0,0);
    keybd_event(VK_TAB,0,keyeventf_keyup,0 );
    Pause(100);
    keybd_event(VK_RETURN,0,0,0);
    keybd_event(VK_RETURN,0,keyeventf_keyup,0 );
    Pause(100);
  end;
  // Ждём
  wnd:=FindControl(MainWindow,'','Tfrm_tbar',0,0,0);
  wnd:=FindControl(MainWindow,'','TCoolBar',0,0,0);
  wnd:=FindControl(MainWindow,'','TPageScroller',11,29,0);
  wnd:=FindControl(wnd,'ToolBar2','TToolBar',0,0,0);
  MemoLog.Lines.Add('Начало сканирования');
  endOk:=0;
  repeat
    PauseAndMouse;
    if Cancel then begin
      ActiveWin(MainWindow);
      keybd_event(VK_CONTROL, 0, 0, 0);
      keybd_event(Ord('T'), 0, 0, 0);
      keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
      Pause(100);
      keybd_event(VK_RETURN,0,0,0);
      keybd_event(VK_RETURN,0,keyeventf_keyup,0 );
      MemoLog.Lines.Add('Отмена');
      goto en;
    end;
    endS:=SendMessage(wnd, TB_GETSTATE, 12, 0)=0;
    if endS then Inc(endOk)
            else endOk:=0;
  until endOk>2;
  Pause(3000);
  MemoLog.Lines.Add('Окончание сканирования');
  // Сохранение
  MemoLog.Lines.Add('Начало создания отчёта');
  Pause(100);
  ActiveWin(MainWindow);
  // Щелкаем по кнопке
  wl:=((WRect.Right-WRect.Left)-WClientRect.Right) div 2;
  wt:=(WRect.Bottom-WRect.Top)-WClientRect.Bottom-wl;
  SetCursorPos(WRect.Left+wl+290,
               WRect.Top+wt+13);
  mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
  Application.ProcessMessages;
  mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
  Pause(100);
  // Выбираем пункт сохрангения
  SetCursorPos(WRect.Left+wl+290,
               WRect.Top+wt+32);
  mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
  Application.ProcessMessages;
  mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
  // Мастер сохранения
  if not FindWindowWait('', 'Tfm_report', 10, 5,  wnd) then Exit;
  Pause(100);
  MemoLog.Lines.Add('Мастер отчёта 1');
  PressButton(wnd,'Далее');
  MemoLog.Lines.Add('Мастер отчёта 2');
  Pause(1000);
  PressButton(wnd,'Добавить текущее');
  Pause(2000);
  PressButton(wnd,'Далее');
  Pause(1000);
  MemoLog.Lines.Add('Мастер отчёта 3');
  PressButton(wnd,'Сохранить',true);
  // Диалог
  SaveDialog('Сохранить',PathRep+'XSpider\report.lnk');
  Pause(1000);
  PressButton(wnd,'Закрыть',true);
  En:
end;

procedure TFormMain.ServerConnect(AContext: TIdContext);
begin
  MemoServer.Lines.Add(FormatDateTime('hh:mm',now)+': '+Client.Host+': служ. сервер подключен');
  TrayIcon.IconIndex:=1;
  try
    ico := TIcon.Create;
    ImageList_Tree.GetIcon(1, ico);
    Application.Icon:=ico;
    ico.Free;
  except  end;
end;

procedure TFormMain.ServerDisconnect(AContext: TIdContext);
begin
  MemoServer.Lines.Add(FormatDateTime('hh:mm',now)+': '+Client.Host+': служ. сервер отключен');
  TrayIcon.IconIndex:=0;
  try
    ico := TIcon.Create;
    ImageList_Tree.GetIcon(0, ico);
    Application.Icon:=ico;
    ico.Free;
  except  end;
end;

procedure TFormMain.ServerExecute(AContext: TIdContext);
var msg:string;
    i:integer;
begin
  try
    Msg:= AContext.Connection.IOHandler.ReadLn(TEncoding.unicode);
  except
    msg:='';
  end;
  if msg='' then Exit;


  MemoServer.Lines.Add(Msg);

  // Получили установку сервера
  i:=pos(Server_Set+'=',Msg);
  if i>0 then begin
    MemoServer.Lines.Add(FormatDateTime('hh:mm',now)+': '+' Команда установки IP сервера');
    Delete(Msg,1,length(Server_Set)+1);
    msg:=Trim(Msg);
    Edit_Server.Text:=Msg;
    AContext.Connection.IOHandler.WriteLn(Server_Set+'='+ip,TEncoding.unicode);
//    Pause(100);
//    AContext.Connection.Disconnect;
    Exit;
  end;
  AContext.Connection.Disconnect;
  MemoServer.Lines.Add(FormatDateTime('hh:mm',now)+': '+'Соединяемся с сервером');
  Client.Host := Edit_Server.Text;
  if  Client.Connected then Client.Disconnect;
  Client.Connect;
end;

function GetFileSize(FileName: String): Integer;
var
  FS: TFileStream;
begin
  try
    FS := TFileStream.Create(Filename, fmOpenRead);
  except
    Result := -1;
  end;
  if Result <> -1 then Result := FS.Size;
  FS.Free;
end;

function FullDirectoryCopy(SourceDir, TargetDir: string; StopIfNotAllCopied,
  OverWriteFiles: Boolean): Boolean;
var
  SR: TSearchRec;
  I: Integer;
begin
  Result := False;
  SourceDir := IncludeTrailingBackslash(SourceDir);
  TargetDir := IncludeTrailingBackslash(TargetDir);
  if not DirectoryExists(SourceDir) then
    Exit;
  if not ForceDirectories(TargetDir) then
    Exit;

  I := FindFirst(SourceDir + '*', faAnyFile, SR);
  try
    while I = 0 do
    begin
      if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
      begin
        if SR.Attr = faDirectory then
          Result := FullDirectoryCopy(SourceDir + SR.Name, TargetDir + SR.NAME,
            StopIfNotAllCopied, OverWriteFiles)
        else if not (not OverWriteFiles and FileExists(TargetDir + SR.Name))
          then
          Result := CopyFile(Pchar(SourceDir + SR.Name), Pchar(TargetDir +
            SR.Name), False)
        else
          Result := True;
        if not Result and StopIfNotAllCopied then
          exit;
      end;
      I := FindNext(SR);
    end;
  finally
    SysUtils.FindClose(SR);
  end;
end;

function TFormMain.Ret(WCaption, WClas, EXE:string):boolean;
var wnd,wnd2: HWND;
    wl,wt,x,y,i:integer;
    CI: TCursorInfo;
    s:string;
label en;
begin
  Result:=true;
  s:=PathPr+'Retina NSS\Logs\TargetLog.txt';
  if FileExists(s) then DeleteFile(s);
  Pause(100);
  FileCopy(Path+'TargetLog.txt',s);
  Pause(100);
  // Копируем файл профиля
  if not Check_Fast.Checked then begin
    MemoLog.Lines.Add('Копируем профиль');
    DeleteFile(PathPr+'Retina NSS\retinaconfig.xml');
    DeleteFile(PathPr+'Retina NSS\AppSettings.xml');
    Pause(500);
    FileCopy(Path+'retinaconfig.xml',PathPr+'Retina NSS\retinaconfig.xml');
    FileCopy(Path+'AppSettings.xml',PathPr+'Retina NSS\AppSettings.xml');
    MemoLog.Lines.Add('Окончание копирования');
    Pause(1000);
  end;
  // Запуск программы
  if not RunProgram(WCaption, WClas,
                    path, EXE,  MainWindow, WRect, WClientRect ) then Exit(false);
   // Если есть окно лицензии
  u_API.IgnorError:=true;
  if FindWindowWait('Licensing Notice', 'ThunderRT6FormDC', 3, 3,  wnd) then
  if wnd>0 then begin
    SendMessage (wnd,WM_CLOSE,0,0);
    Pause(1000);
    ActiveWin(MainWindow);
  end;
  u_API.IgnorError:=false;
  // запуск
  notcon:=true;
  MemoLog.Lines.Add('Запуск');
  wnd:=FindControl(MainWindow,'QuickScan','Afx',0,0,0);
  wl:=((WRect.Right-WRect.Left)-WClientRect.Right) div 2;
  wt:=(WRect.Bottom-WRect.Top)-WClientRect.Bottom-wl;
  x:=WRect.Left+wl+480;
  y:=WRect.Top+wt+35;
  SetCursorPos(x,y);
  mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
  Application.ProcessMessages;
  mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
  Application.ProcessMessages;
  // Контроль
  MemoLog.Lines.Add('Контроль прогресса');
  repeat
    PauseAndMouse;
    if Cancel then begin
      MemoLog.Lines.Add('Отмена');
      goto en;
    end;
  until GetFileSize(s)>2;
  MemoLog.Lines.Add('Сканирование завершено');

  // Готовим запись отчётов
  KillDir(PathPr+'Retina NSS\Reports\Temp\',[]);
  ActiveWin(MainWindow);
  Pause(100);

  // Переходим на Remediate
  wnd:=FindControl(MainWindow,'','ThunderRT6UserControlDC',216,14,0);
  SendMessage (wnd,WM_LBUTTONDOWN,0,0);
  SendMessage (wnd,WM_LBUTTONUP,0,0);
  for i:=1 to 4 do begin
    keybd_event(VK_TAB, 0, 0, 0);
    keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
    Pause(100);
  end;
  keybd_event(VK_RETURN,0,0,0);
  Pause(100);
  keybd_event(VK_RETURN,0,keyeventf_keyup,0 );
  Pause(10000);

  // Переходим на Report
  wnd:=FindControl(MainWindow,'','ThunderRT6UserControlDC',320,14,0);
  SendMessage (wnd,WM_LBUTTONDOWN,0,0);
  SendMessage (wnd,WM_LBUTTONUP,0,0);
  for i:=1 to 3 do begin
    keybd_event(VK_TAB, 0, 0, 0);
    Pause(100);
    keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
    Pause(100);
  end;
  keybd_event(VK_RETURN,0,0,0);
  Pause(100);
  keybd_event(VK_RETURN,0,keyeventf_keyup,0 );
  Pause(10000);

  // Копируем отчёты
  FullDirectoryCopy(PathPr+'Retina NSS\Reports\Temp\', PathRep+'Retina NSS',true,true);

  en:
  notcon:=False;
end;

function TFormMain.LG(WCaption, WClas, EXE:string):boolean;
var wnd,wnd2: HWND;
    wl,wt,i,j,x,y,i2,tmp,fg2:integer;
    s,ss:Extended;
    fg:boolean;
label en;
begin
  // Копируем файл профиля
  if not Check_Fast.Checked then begin
    MemoLog.Lines.Add('Копируем профиль');
    DeleteFile(PathPr+'LANguard NSS\Data\operationsprofiles.mdb');
    Pause(500);
    FileCopy(Path+'operationsprofiles.mdb',PathPr+'LANguard NSS\Data\operationsprofiles.mdb');
    MemoLog.Lines.Add('Окончание копирования');
    Pause(1000);
  end;
  Result:=true;

  // Запуск программы
  MemoLog.Lines.Add('    Открываем Splash');
  if not RunProgram(WCaption, WClas,
                    path, EXE,  MainWindow, WRect, WClientRect ) then Exit(false);

  // ждём закрытие Splash
  MemoLog.Lines.Add('    Ждём закрытие Splash');
  repeat
    pause(1000);
  until FindWindowWait('LANguard',
                       'WindowsForms10.Window.8',
                        5, 5,  MainWindow, 0, 600);
  ActiveWin(MainWindow);
  GetWindowRect(MainWindow,Wrect);
  Windows.GetClientRect(MainWindow,WClientRect);
  MemoLog.Lines.Add('    Splash закрылся');
  MemoLog.Lines.Add('    Ждём 10 сек');
  SetWindowPos(MainWindow, 0, 0, 0, 0, 0, SWP_NOSIZE);
  Pause(10000);
  // Жмём Custom Scan
  MemoLog.Lines.Add('Жмём Custom Scan');
  wnd:=FindControl(MainWindow,'Launch a Custom','WindowsForms10.STATIC',0,0,0);
  if wnd=0 then Exit(false);
  fg2:=0;
  repeat
    ActiveWin(MainWindow);
    Application.ProcessMessages;
    PostMessage (wnd,WM_LBUTTONDOWN,0,0); Pause(500);
    PostMessage (wnd,WM_LBUTTONUP,0,0);   Pause(500);
    // окно сканирования
    MemoLog.Lines.Add('Ищем окно Custom Scan Wizard. Попытка '+inttostr(fg2+1));
    fg:=FindWindowWait('Custom', 'TfrmStartScanWiz', 10, 2,  wnd, MainWindow);
    if fg then Break;
    if fg2>3 then Exit(false);
    fg2:=fg2+1;
    Pause(1000);
  until false;

  ActiveWin(wnd);
  Pause(2000);
  MemoLog.Lines.Add('Открыли визард сканирования');
  for i := 1 to 4 do begin
    PressButton(wnd,'Next',false);
    Pause(500);
  end;
  MemoLog.Lines.Add('Начало сканирования');
  PressButton(wnd,'Scan');
  Pause(2000);
  // Контролируем завершение процесса сканирования
  i2:=0;  i:=0;
  wnd2:=FindControl(MainWindow,'','WindowsForms10.msctls_progress32',0,0,0);
  MemoLog.Lines.Add('  Контроль прогресса 0%');
  tmp:=MemoLog.Lines.Count-1;
  repeat
    PauseAndMouse;
    i2:=i;
    i:=SendMessage (wnd2,PBM_GETPOS,0,0);
    MemoLog.Lines[tmp]:='  Контроль прогресса '+inttostr(i)+'%';
    if Cancel then begin
      MemoLog.Lines.Add('Отмена');
      goto en;
    end;
  until (i=0) and (i<>i2);
  MemoLog.Lines.Add('Завершение сканирования');
  // Сохранение результатов
  MemoLog.Lines.Add('Сохранение отчёта');
  Pause(1000); ActiveWin(MainWindow); Pause(100);
  keybd_event(VK_CONTROL, 0, 0, 0);
  keybd_event(Ord('S'), 0, 0, 0);
  keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  Pause(100);
  //  Работа с диалогом сохранения
  SaveDialog('Сохранить как',PathRep+'LANguard NSS\report.xml');
  en:
end;


function TFormMain.SSS(WCaption, WClas, EXE:string):boolean;
var wnd,wnd2,wnd3,h,h2,w: HWND;
    wl,wt,i,j,x,y,d,xa,ya,k:integer;
    s,ss:Extended;
    app:String;
    buf : array[0..$FF] of char;
    Size : integer;
    rc,rc2:TRect;
label en;
begin
  // Удаляем профиль
  if not Check_Fast.Checked then begin
    MemoLog.Lines.Add('Удаляем профиль');
    app := '%APPDATA%\';
    Size := ExpandEnvironmentStrings(PChar(app), buf, sizeof(buf));
    app:=copy(buf, 1, Size);
    if (TOSInfo.IsWin7) or (TOSInfo.IsWinVista)  then
      app:=app+'\Roaming\Thinstall\'
    else
      app:=app+'\Thinstall\';
    KillDir(app+'Shadow Security Scanner 7.303',[]);
    MemoLog.Lines.Add('Профиль удалён');
  end;

  Result:=true;
  // Запуск программы
  if not RunProgram(WCaption, WClas,
                    path, EXE,  MainWindow, WRect, WClientRect ) then Exit(false);

  // ждём закрытие Splash
  MemoLog.Lines.Add('    Ждём закрытие Splash');
  IgnorError:=true;
  repeat
    Pause(5000);
  until FindWindowWait('Shadow Security Scanner', 'TMainForm', 10, 10,  MainWindow);
  IgnorError:=false;
  SetWindowPos(MainWindow, 0, 0, 0, 0, 0, SWP_NOSIZE);
  GetWindowRect(MainWindow,Wrect);
  Windows.GetClientRect(MainWindow,WClientRect);

  MemoLog.Lines.Add('    Splash закрывлся');
  // Новая сесия
  // Щелкаем по кнопке
  ActiveWin(MainWindow);
  MemoLog.Lines.Add('    Новая сессия');

  wnd:=FindControl(MainWindow,'File','TdxBarControl',0,0,0);
  wnd2:=GetParent(wnd);
  // размер бордюров
  wl:=((WRect.Right-WRect.Left)-WClientRect.Right) div 2;
  wt:=(WRect.Bottom-WRect.Top)-WClientRect.Bottom-wl;
  // Начало клиентской области
  wl:=WRect.Left+wl;
  wt:=WRect.Top+wt;
  // размер контрола и его родителя
  GetWindowRect(wnd,rc);
  GetWindowRect(wnd2,rc2);
  x:=Abs(rc2.Left-rc.Left)+wl;
  y:=Abs(rc2.Top-rc.Top)+wt;
  SetCursorPos(x+40,y+20);
  xa:=x+100;ya:=y+60;

  Pause(100);
  mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
  Application.ProcessMessages;
  mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
  Pause(1000);

  // Визард
  if not FindWindowWait('New session', 'TSSSModalForm', 5, 5,  wnd) then exit;
  MemoLog.Lines.Add('    Открыли диалог сессии');
  ActiveWin(wnd);
  wnd3:=wnd;
  // Визард 1
  Pause(100);
  for i:=1 to 6 do begin
    keybd_event(VK_TAB, 0, 0, 0);
    keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
    Pause(100);
  end;
  for i:=1 to 7 do begin
    keybd_event(VK_DOWN, 0, 0, 0);
    keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
    Pause(100);
  end;
  keybd_event(VK_RETURN,0,0,0);
  keybd_event(VK_RETURN,0,keyeventf_keyup,0 );
  // Визард 2
  Pause(1000);
  for i:=1 to 4 do begin
    keybd_event(VK_TAB, 0, 0, 0);
    keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
    Pause(100);
  end;
  Pause(100);
  keybd_event(VK_RETURN,0,0,0);
  keybd_event(VK_RETURN,0,keyeventf_keyup,0 );
  Pause(1000);
  // IP адрес
  if not FindWindowWait('Add host', 'TSSSModalForm', 5, 5,  wnd2) then exit;
  ActiveWin(wnd2);
  MemoLog.Lines.Add('Вставка IP');
  wnd:=FindControl(wnd2,'Select','TGroupBox',0,0,0);
  wnd:=FindControl(wnd,'','TComboBox',0,0,0);
  EditControl(wnd,0,0,0,IP);
  PressButton(wnd2,'OK');
//  PressButton(wnd3,'Next');
  if not FindWindowWait('New session', 'TSSSModalForm', 5, 5,  wnd) then exit;
  ActiveWin(wnd);
  // Далее
  for i:=1 to 4 do begin
    keybd_event(VK_TAB, 0, 0, 0);
    keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
  end;
  Pause(100);
  keybd_event(VK_RETURN,0,0,0);
  keybd_event(VK_RETURN,0,keyeventf_keyup,0 );
  Pause(100);
  // Сканирование
  // Щелкаем по кнопке
  ActiveWin(MainWindow);
  MemoLog.Lines.Add('    Новая сессия');

  wnd:=FindControl(MainWindow,'Actions','TdxBarControl',0,0,0);
  wnd2:=GetParent(wnd);
  // размер бордюров
  wl:=((WRect.Right-WRect.Left)-WClientRect.Right) div 2;
  wt:=(WRect.Bottom-WRect.Top)-WClientRect.Bottom-wl;
  // Начало клиентской области
  wl:=WRect.Left+wl;
  wt:=WRect.Top+wt;
  // размер контрола и его родителя
  GetWindowRect(wnd,rc);
  GetWindowRect(wnd2,rc2);
  x:=Abs(rc2.Left-rc.Left)+wl;
  y:=Abs(rc2.Top-rc.Top)+wt;
  SetCursorPos(x+40,y+20);

  mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
  Application.ProcessMessages;
  mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
  Pause(100);
  // В 0 позицию
  SetCursorPos(WRect.Left+10,
               WRect.Top+10);
  // Контроль процесса
  MemoLog.Lines.Add('    Контроль процесса');
  repeat
    PauseAndMouse;
    if FindPict(xa,ya,ImageSSS1) then break;
    Pause(100);
    if FindPict(xa,ya,ImageSSS2) then break;
    Pause(100);
    if FindPict(xa,ya,ImageSSS3) then break;
    Pause(100);
    if FindPict(xa,ya,ImageSSS4) then break;
    Pause(100);
    if FindPict(xa,ya,ImageSSS5) then break;
    Pause(100);
    if Cancel then begin
      MemoLog.Lines.Add('Отмена');
      goto en;
    end;
  until false;
  Pause(1000);
  MemoLog.Lines.Add('    Процесс закончен');
  // Сохранение
  // Щелкаем по кнопке
  MemoLog.Lines.Add('    Сохранение');
  ActiveWin(MainWindow);

  wnd:=FindControl(MainWindow,'Options','TdxBarControl',0,0,0);
  wnd2:=GetParent(wnd);
  // размер бордюров
  wl:=((WRect.Right-WRect.Left)-WClientRect.Right) div 2;
  wt:=(WRect.Bottom-WRect.Top)-WClientRect.Bottom-wl;
  // Начало клиентской области
  wl:=WRect.Left+wl;
  wt:=WRect.Top+wt;
  // размер контрола и его родителя
  GetWindowRect(wnd,rc);
  GetWindowRect(wnd2,rc2);
  x:=Abs(rc2.Left-rc.Left)+wl;
  y:=Abs(rc2.Top-rc.Top)+wt;
  SetCursorPos(x+150,y+20);

  Pause(100);
  mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
  Application.ProcessMessages;
  mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
  Pause(1000);
  // Визщард сохранения
  if not FindWindowWait('Report wizard', 'TReportWizardForm', 5, 5,  wnd) then exit;
  ActiveWin(wnd);
  Pause(100);
  // 1 окно
  PressButton(wnd,'Add current session');
  for I := 1 to 4 do begin
    Pause(500);
    ActiveWin(wnd);
    Pause(100);
    keybd_event(VK_RETURN,0,0,0);
    Pause(100);
    keybd_event(VK_RETURN,0,keyeventf_keyup,0 );
  end;
  Pause(500);
  // диалог сохранения
  MemoLog.Lines.Add('    Открываем диалог сохранения');
  SaveDialog('Открыть',PathRep+'Shadow Security Scanner\report.html');

  // Минимизация браузера
  Pause(3000);
  k:=0;  h2:=0;
  repeat
    h:=GetForegroundWindow;
    if h=h2 then inc(k)
            else k:=0;
    h2:=h;
    if k>5 then break;
    pause(1000);
  until false;
  ShowWindow(h,SW_MINIMIZE);

  // Закрываем визард сохранения
  MemoLog.Lines.Add('    Закрываем визард сохранения');
  ActiveWin(MainWindow);
  Pause(500);
  keybd_event(VK_ESCAPE,0,0,0);
  keybd_event(VK_ESCAPE,0,keyeventf_keyup,0 );
  en:
end;

function TFormMain.SS(WCaption, WClas, EXE:string):boolean;
var wnd: HWND;
    s:string;
    Style,msg:integer;
    Buff: PChar;
    t:TStringlIst;
    x:TStrings;
label en;
begin
  Result:=true;

  // Копируем файл профиля
  x:=TStringList.Create;
  MemoLog.Lines.Add('Копируем профиль');
  DeleteFile(PathPr+'Super Scan\scanner.ini');
  Pause(500);
  if not Check_Fast.Checked then
    FileCopy(Path+'scanner.ini',PathPr+'Super Scan\scanner.ini')
  else
    FileCopy(Path+'scanner_fast.ini',PathPr+'Super Scan\scanner.ini');
  Pause(500);
  // Втавка IP
  x.LoadFromFile(PathPr+'Super Scan\scanner.ini');
  x.Text:=AnsiReplaceStr(x.Text,'0.0.0.0',IP);
  x.SaveToFile(PathPr+'Super Scan\scanner.ini');
  Pause(1000);
  x.Free;
  MemoLog.Lines.Add('Окончание копирования');

  // Запуск программы
  if not RunProgram(WCaption, WClas,
                    path, EXE,  MainWindow, WRect, WClientRect ) then Exit(false);
  // Втавка IP
{  MemoLog.Lines.Add('    Вставка IP');
  EditControl(MainWindow,0,50,0,IP);
  EditControl(MainWindow,0,118,0,IP);
  EditControl(MainWindow,0,142,0,IP);}
  // Нажатие на кнопку Start
  MemoLog.Lines.Add('Начало сканирования');
  wnd:=FindControl(MainWindow,'Start','Button',0,0,0);;
  PressButton(MainWindow,'Start');
  // Ожидание процесса
  Pause(1000);
  t:=TStringList.Create;
  repeat
    PauseAndMouse;
    GetWindowStyle(wnd,t);
    if Cancel then begin
      MemoLog.Lines.Add('Отмена');
      goto en;
    end;
  until t.IndexOf('WS_DISABLED')=-1;
  t.Free;
  MemoLog.Lines.Add('Завершение сканирования');
  // Жмем Save
  Pause(1000);
  MemoLog.Lines.Add('Сохраняем отчет');
  PressButton(MainWindow,'Save',True);
  //  Работа с диалогом сохранения
  SaveDialog('Save',PathRep+'Super Scan\report.html');
  // Закрываем сообщение об успешном сохранении
  if FindWindowWait('SuperScan', '#32770', 10, 5,  wnd) then
    PressButton(wnd,'');
  en:
end;

function TFormMain.ENT(WCaption, WClas, EXE:string):boolean;
var wnd,wnd2,wnd3,hw,wndPanel: HWND;
    s,d:string;
    f:ansistring;
    KeyState: TKeyboardState;
    OldCtrl: byte;
    tid: DWORD;
    i,i2,tmp,wl,wt:integer;

Label en;

procedure IncUpDownPos(UpDown:HWND;Delta:Integer);
var
 CurrPos:SmallInt;
 Range:Integer;
begin
 CurrPos:=Lo(SendMessage(UpDown,UDM_GETPOS,0,0));
 Range:=SendMessage(UpDown,UDM_GETRANGE,0,0);
 if (CurrPos+Delta>=Hi(Range))and(CurrPos+Delta<=Lo(Range)) then
   SendMessage(UpDown,UDM_SETPOS,0,MakeLong(CurrPos+Delta,0));
end;

begin
  Result:=true;
  // Внесение в реестр основных параметров
  if not Check_Fast.Checked then begin
    MemoLog.Lines.Add('    Удаление ветки реестра');
    DeleteRegistryKey(HKEY_CURRENT_USER,'Software\','ENT3');
    Pause(500);
    MemoLog.Lines.Add('    Восстановление ветки реестра');
    d:=path+'NNT.rg';
    LoadKeyFromFile(HKEY_CURRENT_USER,'Software\ENT3',PChar(d));
    Pause(500);
  end;

  // Запуск программы
  if not RunProgram(WCaption, WClas,
                    path, EXE, MainWindow, WRect, WClientRect ) then Exit(false);

  // Доступ к параметрам
  wnd:=FindControl(MainWindow,'','TPageControl',0,0,0);
  wnd:=FindControl(wnd,'PS','TTabSheet',0,0,0);
  wnd:=FindControl(wnd,'','TElGroupBox',0,0,0);
  wnd:=FindControl(wnd,'','TPanel',3,16,0);
  // Запоминаем ID прогреса
  wnd2:=FindControl(wnd,'','TProgressBar',0,0,0);

  // Ищем область ввода IP
  MemoLog.Lines.Add('    Вставка IP');
  wnd3:=FindControl(wnd,'','TElAdvancedComboBox',11,19,0);
  EditControl(wnd3,0,0,0,IP);
  wnd:=FindControl(wnd,'','TElAdvancedComboBox',11,66,0);
  EditControl(wnd,0,0,0,IP,wnd);

  // Нажатие на кнопку
  ActiveWin(MainWindow);
  Pause(500);
  SendMessage (wnd,WM_LBUTTONDOWN,0,0);
  Pause(100);
  SendMessage (wnd,WM_LBUTTONUP,0,0);
  Pause(100);
  keybd_event(13,0,0,0);
  Pause(100);
  keybd_event(13,0,keyeventf_keyup,0);


  Pause(1000);
  // Смотрим предупреждение
  if TOSInfo.IsWin7 then hw:=FindWindow('#32770', 'Warning')
                    else hw:=FindWindow('TMessageForm', 'Warning');
  if hw>0 then begin
    MemoLog.Lines.Add('  Закрываем предупреждение');
    wnd:=FindControl(hw,'&Yes','Button',0,0,0);
    SendMessage (wnd,BM_CLICK,0,0);
  end;
  // Контролируем завершение процесса сканирования
  i2:=0;  i:=0;
  MemoLog.Lines.Add('  Контроль прогресса 0%');
  tmp:=MemoLog.Lines.Count-1;
  repeat
    PauseAndMouse;
    i2:=i;
    i:=SendMessage (wnd2,PBM_GETPOS,0,0);
    MemoLog.Lines[tmp]:=('  Контроль прогресса '+inttostr(i)+'%');
    if Cancel then begin
      MemoLog.Lines.Add('Отмена');
      goto en;
    end;
  until (i=0) and (i<>i2);
  MemoLog.Lines.Add('Завершение сканирования');
  // Сохранение результатов
  Pause(1000);
  wnd:=FindControl(MainWindow,'ToolButtonBar','TTBXToolbar',0,0,0);
  Pause(100);
  ActiveWin(MainWindow);
  // Щелкаем по кнопке
  wl:=((WRect.Right-WRect.Left)-WClientRect.Right) div 2;
  wt:=(WRect.Bottom-WRect.Top)-WClientRect.Bottom-wl;
  SetCursorPos(WRect.Left+wl+109,
               WRect.Top+wt+40);
  mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
  Application.ProcessMessages;
  mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
  Pause(100);
  // Выбираем пункт сохрангения
  SetCursorPos(WRect.Left+wl,
               WRect.Top+wt);
  SetCursorPos(WRect.Left+109, WRect.Top+85+45);

  mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
  Application.ProcessMessages;
  mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
  //  Работа с диалогом сохранения
  SaveDialog('PortScan',PathRep+'Essential NetTools\report.html');
  en:
end;


procedure TFormMain.ApplicationEventsMinimize(Sender: TObject);
begin
  ShowWindow(Application.Handle, sw_Hide);
end;

procedure ScreenShot(x: Integer;
   y: Integer;
   Width: Integer;
   Height: Integer;
  bm: TBitMap);
var
   dc: HDC;
   lpPal: PLOGPALETTE;
 begin
   if ((Width = 0) or
     (Height = 0)) then
     Exit;
   bm.Width  := Width;
   bm.Height := Height;
   {get the screen dc}
   dc := GetDc(0);
   if (dc = 0) then
     Exit;
   {do we have a palette device?}
   if (GetDeviceCaps(dc, RASTERCAPS) and
     RC_PALETTE = RC_PALETTE) then
   begin
     {allocate memory for a logical palette}
     GetMem(lpPal,
       SizeOf(TLOGPALETTE) +
     (255 * SizeOf(TPALETTEENTRY)));
     {zero it out to be neat}
     FillChar(lpPal^,
       SizeOf(TLOGPALETTE) +
     (255 * SizeOf(TPALETTEENTRY)),
       #0);
     {fill in the palette version}
     lpPal^.palVersion := $300;
     {grab the system palette entries}
     lpPal^.palNumEntries :=
       GetSystemPaletteEntries(dc,
       0,
       256,
       lpPal^.palPalEntry);
     if (lpPal^.PalNumEntries <> 0) then
       {create the palette}
       bm.Palette := CreatePalette(lpPal^);
     FreeMem(lpPal, SizeOf(TLOGPALETTE) +
     (255 * SizeOf(TPALETTEENTRY)));
   end;
   {copy from the screen to the bitmap}
   BitBlt(bm.Canvas.Handle,
     0,
     0,
     Width,
     Height,
     Dc,
     x,
     y,
     SRCCOPY);
   {release the screen dc}
   ReleaseDc(0, dc);
 end;

Function TFormMain.FindPict(x,y:integer;tr:timage):Boolean;
var t:tbitmap;
    s,i,j,k,l,tb,fb,rr,gg,bb,e:longint;
    b:boolean;
begin
  t:=TBitmap.Create;
  // Скриншот
  ScreenShot(x,y,80,80,t);
  // Поиск
  // Цикл по скриншоту
  for I := 0 to t.Width-tr.Picture.Bitmap.Width-2 do begin
    for j:= 0 to t.Height-tr.Picture.Bitmap.Height-2 do begin
      b:=true;
      // Цикл по картинке для поиска
      for k:= 0 to tr.Picture.Bitmap.Width-1 do begin
        for l := 0 to tr.Picture.Bitmap.Height-1 do begin
          // Пиксель скринштта и картинки
          tb:=t.Canvas.Pixels[i+k,j+l];
          fb:=tr.Picture.Bitmap.Canvas.Pixels[k,l];
          // разность rgb составляющих
          rr:=abs(GetRValue(tb)-GetRValue(fb));
          gg:=abs(GetGValue(tb)-GetGValue(fb));
          bb:=abs(GetBValue(tb)-GetBValue(fb));
          e:=rr+gg+bb;
          // Нашли
          if e>3 then begin
            b:=false;
            break;
          end else
          b:=true;
        end;
        if not b then break; // нашли
      end;
      if b then break; // Нашли
    end;
    if b then break; // Нашли
  end;
  t.Free;
  Result:=b;
end;

procedure TFormMain.Button_SendClick(Sender: TObject);
begin
  SendReports;
end;

procedure TFormMain.Button1Click(Sender: TObject);
begin
  FindWindowWait;
end;

procedure TFormMain.Button2Click(Sender: TObject);
var d:string;
begin
  d:='c:\1.rg';
  SaveKeyToFile(HKEY_CURRENT_USER,'Software\ENT3',PChar(d));
end;

procedure TFormMain.Button_CancelClick(Sender: TObject);
begin
  isRun:=false;
  Button_Cancel.Enabled:=False;
  Cancel:=True;
end;

function GetDirSize(const aPath: string):Int64;
var
  SR: TSearchRec;
  tPath: string;
begin
  Result:=0;
  tPath := IncludeTrailingBackSlash(aPath);
  if FindFirst(tPath + '*.*', faAnyFile, SR) = 0 then
  begin
    try
      repeat
        if (SR.Name = '.') or (SR.Name = '..') then
          Continue;
        if (SR.Attr and faDirectory) <> 0 then
        begin
          Result:=GetDirSize(tPath + SR.Name);
          Continue;
        end;
        Result := Result + (SR.FindData.nFileSizeHigh shl 32) +
                            SR.FindData.nFileSizeLow;
      until FindNext(SR) <> 0;
    finally
      Sysutils.FindClose(SR);
    end;
  end;
end;

function TFormMain.SendReports:boolean;
var Sr: SysUtils.TSearchRec;
  error:boolean;
  NError:Integer; // счётчик передач
  FName:string;
label dfg;
begin

  if not run then begin
    MemoLog.Lines.Add('Соединение не обнаружено.');
    Exit(false);
  end;

//  Client.IOHandler.WriteLn(Client_StartFTP,TEncoding.unicode);
//  Pause(1000);

  Result:=True;
  FTP.Host:=Edit_Server.Text;
  NError:=0;
  dfg:
  inc(NError);
  if NError>5 then begin
    MemoLog.Lines.Add('    Попытки закончены. Ждём следующей отправки.');
    FindClose(sr);
    Exit(false); // 5 попыток и выходим
  end;
  // Цикл по файлам отчётов и передача их по FTP
  {$I-}
  if FindFirst(PathToSend + '*.sen', faDirectory, Sr) = 0 then repeat
    FName:=Sr.Name;
    if (FName = '.') or (FName = '..') then continue; // Корневые
    // передача
    MemoLog.Lines.Add('Передача: '+FName);
    Pause(100);
    // Соединение с FTP
    MemoLog.Lines.Add('Соединяемся с FTP');
    try
      if not ftp.Connected then FTP.Connect;
    except
      MemoLog.Lines.Add('    Ошибка соединения с FTP');
      FindClose(sr);
      Exit(false);
    end;
    MemoLog.Lines.Add('    Успешно соединились с FTP');
    Client.IOHandler.WriteLn(Client_StartReport+'='+FName+':'+FileCRC32(PathToSend+FName),TEncoding.unicode);
    // Передача по FTP
    try
      MemoLog.Lines.Add('    Начало передачи');
      error:=false;
      FTP.Put(PathToSend+FName, 'Archive\'+ExtractFileName(PathToSend+FName),false);
    except
      error:=true;
    end;
    if Cancel then begin
      FTP.Disconnect;
      FindClose(sr);
      Exit(false);
    end;
    // Повтор
    FTP.Disconnect;
    Pause(1000);
    if error then begin
      MemoLog.Lines.Add('    Ошибка передачи по FTP');
      MemoLog.Lines.Add('    Повтор №'+IntToStr(NError+1));
      FindClose(sr);
      goto dfg;
    end;
    MemoLog.Lines.Add('Окончание передачи отчёта');
    if DeleteFile(PathToSend+FName) then MemoLog.Lines.Add('Удаление отчёта')
                                    else MemoLog.Lines.Add('Отчёт не удалён');
    Client.IOHandler.WriteLn(Client_EndReport,TEncoding.unicode);
  until FindNext(sr) <> 0;
  FindClose(sr);
end;

procedure TFormMain.Button_StartClick(Sender: TObject);
var res,arkf,okScan:Boolean;
    e,s,FName:string;
    Sr: SysUtils.TSearchRec;
    wnd:HWND;
    i:integer;

label bg;
  Procedure EndP;
  begin
    MemoLog.Lines.Add('Завершение работы');
    isRun:=false;
    Button_Start.Enabled:=True;
    ListBox.Enabled:=True;
    Button_Cancel.Enabled:=True;
    Cancel:=False;
    ListErrors.Free;
    Screen.Cursor := crDefault;
  end;
begin
  isRun:=true;
  Cancel:=false;
  if not Check_NonDel.Checked then KillDir(PathRep,[]);         // Очищаем каталоги
  if ListBox.ItemIndex>0 then
    if Check_All.Checked then
      ListBox.ItemIndex:=0;           // первый в списе

  ListErrors:=TStringlist.create;
  // Сценарий действий
  MemoLog.Clear;
  bg:
  u_API.fError:=false;
  u_API.IgnorError:=False;
  if ListBox.ItemIndex>=0 then s:=ListBox.Items[ListBox.ItemIndex]
                          else s:='';
  if run and (s<>'') then
      Client.IOHandler.WriteLn(Client_Progress+'='+s,TEncoding.unicode);

  if run then begin
    Server.Active:=false;
    Client.Disconnect;
  end;

  if s='Essential NetTools' then
    okScan:=ENT('Essential NetTools','TMainForm',ListP.Values[s]);
  if s='Super Scan' then
    okScan:=SS('SuperScan 3.00','PortScanner',ListP.Values[s]);
  if s='XSpider' then
    okScan:=XS('','Tfm_task',ListP.Values[s]);
  if s='Shadow Security Scanner' then
    okScan:=SSS('','TStartupForm',ListP.Values[s]);
  if s='LANguard NSS' then
    okScan:=LG('GFI LANguard ','WindowsForms10.Window.8',ListP.Values[s]);
  if s='Retina NSS' then
    okScan:=Ret('Retina Network Security Scanner','ThunderRT6FormDC',ListP.Values[s]);

  if run then begin	
    Client.Connect;
    Server.Active:=true;
  end;

  // Если были ошибки
  if run then
    if ((not okScan) or (u_API.fError)) then begin
      Client.IOHandler.WriteLn(Client_Error+'='+s,TEncoding.unicode);
      MemoLog.Lines.Add('[Ошибка]');
      MemoLog.Lines.AddStrings(ListErrors);
    end else
       Client.IOHandler.WriteLn(Client_Scan_OK+'='+s,TEncoding.unicode);

  // Если отмена
  if Cancel then begin
    EndP;
    Exit;
  end;

  // Закрытие программы
  if ListBox.ItemIndex>=0 then begin
    MemoLog.Lines.Add('Закрытие программы');
    if not Check_Test.Checked then begin
      Pause(1000);
      PostMessage (MainWindow,WM_CLOSE,0,0);
      Pause(1000);
    end;
  end;

  // XSpider спрашивает о закрытии
  if s='XSpider' then begin
    wnd := FindWin('XSpider', '#32770');
    if wnd>0 then PressButton(wnd,'Нет');
  end;

  // Shadow Security Scanner спрашивает о закрытии
  if s='Shadow Security Scanner' then begin
    MemoLog.Lines.Add('Ищем Confirm');
    u_API.IgnorError:=true;
    if FindWindowWait('Confirm', 'TMessageForm', 5, 0,  wnd) then begin
      MemoLog.Lines.Add('Закрываем Confirm');
      ActiveWin(Wnd);
      Pause(100);
      if not PressButton(wnd,'No') then
        PressButton(wnd,'Нет');
      Pause(100);
    end else
    if FindWindowWait('Confirm', '#32770', 5, 0,  wnd) then begin
      MemoLog.Lines.Add('Закрываем Confirm');
      ActiveWin(Wnd);
      Pause(100);
      if not PressButton(wnd,'No') then
        PressButton(wnd,'Нет');
      Pause(100);
    end;
    u_API.IgnorError:=false;
  end;

  // Переход к следующей программе
  if ListBox.ItemIndex>=0 then
  if Check_All.Checked then begin
    if ListBox.ItemIndex+1<ListBox.Items.Count then begin
      ListBox.ItemIndex:=ListBox.ItemIndex+1;
      Pause(5000);
      goto bg;
    end;
  end;{}

  // Архивация отчетов
  MemoLog.Lines.Add('Архивация ЦП');
  Screen.Cursor:=crHourGlass;
  KillDir(PathToTempSend,[]);
  // Удаление картинок
  KillDir(PathRep,['jpg','gif','png','ico']);
  // Цикл по папкам
  arkf:=false;
  {$I-}
  if FindFirst(PathRep + '*.*', faDirectory, Sr) = 0 then
    repeat
      if (Sr.Name = '.') or (Sr.Name = '..') then continue; // Корневые
        if GetDirSize(PathRep+Sr.Name)=0 then Continue;     // Путые
        // Архивация результата ЦП по отдельности
        Zip.CompressionLevel:=9;
        try Zip.CompressDirectory(PathRep+Sr.Name,true,PathToTempSend+Sr.Name+'.rep'); finally end;
        arkf:=true;
    until FindNext(sr) <> 0;
  FindClose(sr);

  // отправка отчёта об ошибках (если есть)
  if run then begin
    if ListErrors.Count>0 then begin
      MemoLog.Lines.Add('Ошибки '+FName);
      MemoLog.Lines.AddStrings(ListErrors);
      MemoLog.Lines.Add('Отправляем ошибки '+FName);
      // Заголовок
      Client.IOHandler.WriteLn(Client_Error_Start,TEncoding.unicode);
      for I := 0 to ListErrors.Count-1 do begin
        e:=string(Client_Error_Send+'='+ListErrors[i]);
        Client.IOHandler.WriteLn(e,TEncoding.unicode);
      end;
      // Терминал
      Client.IOHandler.WriteLn(Client_Error_End+'='+
                               IP+'_'+
                               MAC+'_'+
                               FormatDateTime('mm#dd#yyyy_hh!nn',now),TEncoding.unicode);
    end;
  end;

  // Конечная упаковка
  if arkf then begin        // Если есть что упаковывать
    MemoLog.Lines.Add('Архивация на отправку '+FName);
    FName:=IP+'_'+MAC+'_'+FormatDateTime('mm#dd#yyyy_hh!nn',now)+'.sen';
    if FileExists(PathToSend+FName) then DeleteFile(PathToSend+FName);
    Zip.CompressionLevel:=-1;
    try Zip.CompressDirectory(PathToTempSend,true,PathToSend+FName); finally end;
    KillDir(PathToTempSend,[]);
  end;

  // Передача отчетов
  if SendReports then
    Client.IOHandler.WriteLn(Client_Scan_OK+'=Send',TEncoding.unicode);

  // Конец
  endP;
end;

procedure TFormMain.FormActivate(Sender: TObject);
var val : TRect;
begin


  if isClose then Exit;

  SystemParametersInfo(SPI_GETWORKAREA, 0, Addr(val), 0);
  Top:=val.Bottom-Height;
  Left:=Screen.Width-Width;

  if Check_Tray.Checked then  begin
    ShowWindow(Application.Handle, SW_MINIMIZE);
    ShowWindow(Application.Handle, sw_Hide);
  end;

  Server.DefaultPort:=dPort;
  Server.Active:=true;

  // Подключениме к серверу
  Client.Port := sPort;
  notcon:=false;

  run:=false;
  repeat
    Client.Host := Edit_Server.Text;
    try
      StatusBar.SimpleText:='Попытка соединения с сервером';
      if notcon then Exit;
      if not Client.Connected then Client.Connect;
    except
      TrayIcon.IconIndex:=0;
      try
        ico := TIcon.Create;
        ImageList_Tree.GetIcon(0, ico);
        Application.Icon:=ico;
        ico.Free;
      except  end;
      StatusBar.SimpleText:='Ошибка соединения с сервером';
      Pause(3000);
    end;
    if cancel then Exit;
    if run then Exit;
  until false;

end;

procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  try
    FreeAndNil(ListP);
  except end;
  isClose:=True;
  FormWait.Exe('Подождте, идет закрытие клиента.');
  Timer.Enabled:=false;
  Cancel:=true;
  u_API.SetCancel;
  // Стоп
  try
    if client.Connected then Client.Disconnect;
  except end;
  Server.Active:=false;
  FormWait.Close;
  Application.Terminate;
end;

procedure TFormMain.ReadSC;
var  i:Integer;
begin
  // Считываем сценарий
  ListBox.Clear;
  ListP.LoadFromFile(Path+'script.txt');
  ListP.Delete(0);
  for I := 0 to ListP.Count-1 do
    ListBox.Items.Add(ListP.Names[i]);
  if ListBox.Items.Count>0 then ListBox.ItemIndex:=0;
end;

procedure TFormMain.FormCreate(Sender: TObject);
var i:integer;
    PathMain:String;
begin

  randomize;

  Admin:=False;

  if ParamCount>0 then
    if ParamStr(1)='admin' then begin
      Admin:=true;
      SetAdmin;
    end;

  ListP:=TStringList.Create;

  isClose:=false;
  Check_AutoStart.Checked := AutorunCheckLnk;  // Проверка автозагрузки

  SetEn;
  // Устанвливаем вывод сообщений
  SetMemo(MemoLog);
  // Пути
  Path:=ExtractFilePath(ParamStr(0));
  PathMain:=ExtractFilePath(Copy(Path,1,Length(Path)-1)+'.tmp');
  PathRep:=PathMain+'Reports\';
  PathToSend:=PathMain+'ToSend\';
  PathToTempSend:=PathMain+'TempSend\';
  PathPr:=ExtractFilePath(Copy(Path,1,Length(Path)-1)+'.tmp');
  PathPr:=PathPr+'Programm\';
  // Хост, IP, Рабочая групппа
  getNet(Host,IP,RG);
  Edit_Host.Text:=Host;
  Edit_IP.Text:=IP;
  Edit_RG.Text := RG;

  // MAC адрес
  MAC:=GetMACAddress;
  Edit_MAC.Text:=MAC;

  // ОС
  Edit_OS.Text:=TOSInfo.ProductName;

  // Проверка соединения с сетью
{  if GetSystemMetrics(SM_NETWORK) and $01=$01 then Edit_Lan.Text:='Комьютер в сети'
                                              else Edit_Lan.Text:='Комьютер не в сети';}

  ReadSc;  // Считываем сценарий

  // сОЗДАНИЕ КАТАЛОГОВ
  if not DirectoryExists(PathToSend) then CreateDir(PathToSend);
  if not DirectoryExists(PathToTempSend) then CreateDir(PathToTempSend);
  if not DirectoryExists(PathRep) then CreateDir(PathRep);
  for I := 0 to ListBox.Count-1 do begin
    PathMain:=PathRep+ListBox.Items[i];
    if not DirectoryExists(PathMain) then CreateDir(PathMain);
  end;

end;

procedure TFormMain.ListBox2Click(Sender: TObject);
begin
  Button_Start.Enabled:=True;
end;



procedure TFormMain.ListBox2DblClick(Sender: TObject);
var s:string;
begin
 if isRun then Exit;
  s:=ListBox.Items[ListBox.ItemIndex];
  s:=PathPr+ListP.Values[s]+'.exe';
  if Exec(s,'','',false,SW_SHOW) then
    MemoLog.Lines.Add('Программа запустилась')
  else begin
    MemoLog.Lines.Add('Программа не обнаружена. Открываем папку.');
    s:=ExtractFilePath(s);
    ShellExecute(Handle, 'explore', PChar(s), nil, nil, SW_SHOW);
  end;
end;

procedure TFormMain.ListBox2DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var s:string;
begin
  if ListP=nil then Exit;
  with ListBox do begin
    s:=Items[Index];
    s:=ListP.Values[s];
    s:=PathPr+s+'.exe';
    if not FileExists(s) then begin
      Canvas.Brush.Color:=clred;
      Canvas.Font.Color:=clWhite;
    end else begin
      Canvas.Brush.Color:=clWhite;
      Canvas.Font.Color:=clBlack;
    end;
    if odSelected in State then  Canvas.Font.Style:=[fsbold];
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left + 3, Rect.Top + 0, Items[Index]);
  end;
end;

procedure TFormMain.MemoLogDblClick(Sender: TObject);
begin
 MemoLog.Clear;
end;

procedure TFormMain.MemoServerDblClick(Sender: TObject);
begin
  MemoServer.Clear;
end;

procedure TFormMain.TimerTimer(Sender: TObject);
var  Msg : string;
begin
  if not Client.Connected then  exit;
  // Читаем сообщение
  Msg := Client.IOHandler.readln('', 5,0,TEncoding.unicode);
  Msg:=Trim(Msg);
  // Если есть сообщение
  if Msg <> '' then begin
    // Старт сценария
    if Msg=Server_Start then begin
      MemoServer.Lines.Add(FormatDateTime('hh:mm',now)+': '+'Старт сценария');
      Button_StartClick(nil);
      exit;
    end;
    // Стоп сценария
    if Msg=Server_Stop then begin
      MemoServer.Lines.Add(FormatDateTime('hh:mm',now)+': '+'Стоп сценария');
      Button_CancelClick(nil);
      exit;
    end;
    // Интерфейс админа
    if Msg=Server_Admin then begin
      Admin:=not Admin;
      if Admin then
        MemoServer.Lines.Add(FormatDateTime('hh:mm',now)+': '+'Вкл. админа')
      else
        MemoServer.Lines.Add(FormatDateTime('hh:mm',now)+': '+'Выкл. админа');
      SetAdmin;
      exit;
    end;
    // Выключение компа
    if Msg=Server_Shutdown then begin
      MemoServer.Lines.Add('Выключение');
      ShutdownComputer;
      exit;
    end;
    // Начало файла сценария
    if Msg=Server_BeginSFile then begin
      MemoServer.Lines.Add('Начало передачи сценария');
      sc:=true;
      Ssc:=TStringList.Create;
      Timer.Interval:=60;
    end;
    // Приём файла сценария
    if sc then begin
      Ssc.Text:=Ssc.Text+Msg;
    end;
    // Окончание файла сценария
    if Msg=Server_EndSFile then begin
      Timer.Interval:=500;
      MemoServer.Lines.Add('Конец передачи сценария');
      sc:=false;
      ssc.Delete(0); ssc.Delete(ssc.Count-1);
      ssc.SaveToFile(path+'script.txt');
      ssc.Free;
      ReadSC;
      Client.IOHandler.WriteLn(Client_SOK+'='+IP,TEncoding.unicode);
      exit;
    end;
    // Отключение
    if Msg=Server_Disconnect then begin
      Client.Disconnect;
      Pause(round(Edit_timeout.Value)*1000);
      FormActivate(nil);
      exit;
    end;
    MemoServer.Lines.Add('['+msg+']');
  end;
end;

procedure TFormMain.TrayIconClick(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_NORMAL);
  ShowWindow(Application.Handle, SW_SHOW);
  ActiveWin(Application.Handle);
end;

procedure TFormMain.Check_AutoStartClick(Sender: TObject);
begin
  if Check_AutoStart.Checked then AutorunAddLnk
                              else AutorunRemoveLnk;
end;

procedure TFormMain.ClientConnected(Sender: TObject);
begin
  StatusBar.SimpleText:='Соединились с сервером: '+Client.Host;
  // Посылка IP при cоединении
  Client.IOHandler.WriteLn(Client_Connect+'='+IP+':'+MAC+':'+Host,TEncoding.unicode);
  run:=true;
  TrayIcon.IconIndex:=1;
  ico := TIcon.Create;
  ImageList_Tree.GetIcon(1, ico);
  Application.Icon:=ico;
  ico.Free;
end;

procedure TFormMain.ClientDisconnected(Sender: TObject);
begin
  StatusBar.SimpleText:='Разъединились с сервером: '+Client.Host;
  run:=false;
  TrayIcon.IconIndex:=0;
  ico := TIcon.Create;
  ImageList_Tree.GetIcon(0, ico);
  Application.Icon:=ico;
  ico.Free;
end;

end.


{

  if Client.Connected then Client.Disconnect;

  Client.IOHandler.WriteLn('Essential NetTools');
}


{

 Pos := SmallPoint(30, 15);
 SendMessage(h, WM_LBUTTONDOWN, 0, Integer(Pos));
 SendMessage(h, WM_LBUTTONUP, 0, Integer(Pos));


 keybd_event(VK_CONTROL, 0, 0 ,0);
    keybd_event(Ord('L'), 0, 0 ,0);
    keybd_event(Ord('L'), 0, KEYEVENTF_KEYUP,0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP,0);   }



{    wnd:=MainWindow;
    tid := GetWindowThreadProcessID(wnd, nil); // h - хендл контрола
    AttachThreadInput(GetCurrentThreadId, tid, True);
    GetKeyboardState(KeyState);
    OldCtrl := KeyState[VK_CONTROL];
    KeyState[VK_CONTROL]:=$80;
    SetKeyboardState(KeyState);
    SendMessage (wnd, WM_KEYDOWN, ord(^L), 0);
    SendMessage (wnd, wm_char, ord(^L), 0);
    SendMessage (wnd, WM_KEYUP, ord(^L), 0);
    KeyState[VK_CONTROL]:=OldCtrl;
    SetKeyboardState(KeyState);
    AttachThreadInput(GetCurrentThreadId,tid,false);}



    {  // Окно
  TMainForm Essential NetTools

  // Установка портов
  TPageControl
  TTabSheet PS
  TElGroupBox
  TPanel (вторая, ширина 261)
  TElAdvancedComboBox
  Edit

  TMessageForm Warning
  &Yes TButton

  ...TTabSheet PS
  TFlatPanel
  TdfsEnhListView
  {}

  {  SetCursorPos(270, 40);
  mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 ); //нажимаем
  Application.ProcessMessages;
  mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ); //отп{}{}
{  Pause(1000);}


{ p := SmallPoint(95, 30);
 SendMessage(MainWindow, WM_LBUTTONDOWN, 0, Integer(p));
 SendMessage(MainWindow, WM_LBUTTONUP, 0, Integer(p));  }

 {  run:=false;
  repeat
    try
      MemoServer.Lines.Add('Попытка соединения с сервером');
      if not Client.Connected then Client.Connect;
    except
     MemoServer.Lines.Add('Ошибка соединения с сервером');
    end;
    if Cancel then Exit;
    Pause(1000);
    if Cancel then Exit;
    if run then Exit;
  until false;}
  //   Client.IOHandler.WriteLn('Hello='+IP);

{
 caption:='';
 cursor:=crHourGlass;
 if FindPict(100,100,ImageSSS1) then caption:='син';
 if FindPict(100,100,ImageSSS2) then caption:='зел';
 if FindPict(100,100,ImageSSS3) then caption:='жёл';
 if FindPict(100,100,ImageSSS4) then caption:='оранж';
 if FindPict(100,100,ImageSSS5) then caption:='крас';
 cursor:=crDefault;


  // Генерация
{  repeat
    CI.cbSize := SizeOf(CI);
    GetCursorInfo(CI);
  until (Ci.hCursor<>65575) or (Ci.hCursor<>65557); // не ожидание  и не часы

  repeat
    h:=GetForegroundWindow;
    caption:=IntToHex(h,4);

    GetMem(lpBuffer, 255);
    GetWindowText(h, lpBuffer, 255);
    caption:=caption+' '+StrPas(lpBuffer);
    FreeMem(lpBuffer, sizeof(lpBuffer^));

    GetMem(lpBuffer, 255);
    GetClassName(h, lpBuffer, 255);
    caption:=caption+' '+StrPas(lpBuffer);
    FreeMem(lpBuffer, sizeof(lpBuffer^));

    pause(100);

  until false;   }


  // Открытие в браузере
{  MemoLog.Lines.Add('    Открываем в браузере');
  if FindWindowWait('Shadow Security Scanner\report.html', 'IE', 10, 10,  wnd2) then begin
    Pause(3000);
    MemoLog.Lines.Add('    Закрываем браузер');
    SendMessage (wnd2,WM_CLOSE,0,0);
    Pause(1000);
  end;}

//  usagelist,pidlist,pidlisttemp,kerneltimelist,kerneltimelisttemp,usertimelist,usertimelisttemp,dtlist,dtlisttemp: TStrings;
{    Function GetCpuUsage(a:Byte):Extended;
    Function ListProcesses(ProcessNameList :String;
                           out ProcessUsageList :Extended):Boolean;}
{Function TFormMain.ListProcesses(ProcessNameList :String; out ProcessUsageList :Extended):Boolean;
var
   ExeName : String;
   _vt,_ct,_et,_kt,_ut:_FILETIME;
   kt,ut:int64;
   b1:LongBool;
   prnum:Byte;
   cpuuse:Extended;
   proc: PROCESSENTRY32;
   hSnap: HWND;
   pid, k1: cardinal;// k1 is the Application Id Which Windows Uses In Kernel
   Looper: BOOL;
begin
   prnum:=0;// I Think It's a bug coz In BDS2006 local variables don't automatically change to zero so we should do it
   pidlist.Clear;
   usertimelist.Clear;
   kerneltimelist.Clear;
   dtlist.Clear;
   proc.dwSize := SizeOf(Proc);//Give proc.dwSize the Size of bytes of PROCESSENTRY32
   hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
   Looper := Process32First(hSnap,proc);
   b1:=False;
   pidlist.Clear;
   kerneltimelist.Clear;
   usertimelist.Clear;
   while Integer(Looper) <> 0 do begin
     ExeName := ExtractFileName(proc.szExeFile);
     k1:=OpenProcess($1F0FFF,b1,proc.th32ProcessID);//Don't ask me why just do It! this is a Routine I don't know Where of Memory is :$1F0FFF
     GetProcessTimes(k1,_ct,_et,_kt,_ut);// This procedure Returns value of used time of cpu for a certain Application. _et & _ct should be used But We don't need them.
     dtlist.Add(inttostr(GetTickCount));// This list saves time in miliseconds for further use
     kt:=_kt.dwHighDateTime;// kt is kernel time
     kt:=kt * 4294967296;// Use This multiple BeCause ( shl ) and ( shr ) don't work with 64bit variables
     kt:=kt+_kt.dwLowDateTime;// Kt is total of _kt.dwLowDateTime and _kt.dwHighDateTime
     ut:=_ut.dwHighDateTime;// ut Is User Time
     ut:=ut * 4294967296;
     ut:=ut+_ut.dwLowDateTime;
     pidlist.Add(inttostr(proc.th32ProcessID));// pid is Process ID and pidlist stores them
     kerneltimelist.Add(inttostr(kt));
     usertimelist.Add(inttostr(ut));
     cpuuse:=GetCpuUsage(prnum);// cpuuse is Used Cpu Usage by current Application
     if ProcessNameList=ExeName then begin
       ProcessUsageList:=cpuuse;
       Result:=True;
       break;
     end else Result:=false;
     Looper := Process32Next(hSnap,proc);//Looper is oposite Zero until there is a program to process by this function
     prnum:=prnum+1;//This calculates number of Applications
   end;
   CloseHandle(hSnap);
end;


Function  TFormMain.GetCpuUsage(a:byte):Extended;
var
   i:Shortint;
   usertime,kerneltime,delaytime:Extended;
begin
  i:=pidlisttemp.IndexOf(pidlist.Strings[a]);//checks if this a new process or not
  if i = -1 then begin//if this is a new process then it's informations will be saved
    pidlisttemp.Add(pidlist.Strings[a]);
    kerneltimelisttemp.Add(kerneltimelist.Strings[a]);
    usertimelisttemp.Add(usertimelist.Strings[a]);
    dtlisttemp.Add(dtlist.Strings[a]);
    Result:=0;
  end else     begin
    delaytime:=strtofloat(dtlist.Strings[a])-strtofloat(dtlisttemp.Strings[i]);
    kerneltime:=strtofloat(kerneltimelist.Strings[a])-strtofloat(kerneltimelisttemp.Strings[i]);
    usertime:=strtofloat(usertimelist.Strings[a])-strtofloat(usertimelisttemp.Strings[i]);
    // CPU Usage Gets From ( ( (NewUserTime-OldUsertime) + (NewKernelTime-OldKernelTime) ) / (Time Between These Two Calculate)
    Result:=(usertime+kerneltime)/(delaytime*100);
    if Result<0 then
      Result:=0;
    dtlisttemp.Strings[i]:=dtlist.Strings[a];
    kerneltimelisttemp.Strings[i]:=kerneltimelist.Strings[a];
    usertimelisttemp.Strings[i]:=usertimelist.Strings[a];
  end;
end;       }

